#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace  std;

int Indegree[10];//标记定点的入度
//邻接矩阵的图结构
typedef struct Graph
{
    vector< vector<int>>v;
    int n;//顶点数
}Graph;

//dfs判断进行有向无环图对的拓扑排序

//思路
//1.将入度为0的点加入栈中
//2.只要栈不空每次从栈顶取出一个节点并且将相应的节点的入度减一 如果相应节点的入度为0则加入栈中
//3.如果输出 循环结束之后 输出的节点个数为n则该图无环并且存在拓扑排序

int main() {

    Graph graph;
     //初始化图
     int m,n,cnt=0;
     graph.n=n;
     cin>>m>>n;//边的条数
     graph.v.resize(10);
     while(m--)
     {
         int a,b;
         cin>>a>>b;
         graph.v[a].push_back(b);
         Indegree[b]++;
     }
     stack<int>s;
     queue<int>q;

     //找到入度为0的点入栈
     for(int i=0;i<n;++i)
     {
         if(Indegree[i]==0)
             s.push(i);
     }

     while(!s.empty())
     {
         int top=s.top();
         q.push(top);
         s.pop();   //先输出栈顶元素在进行相关操作
         for(int i=0;i<graph.v[top].size();++i)
         {
             Indegree[graph.v[top][i]]--;
             if( Indegree[graph.v[top][i]]==0) {
                 s.push(graph.v[top][i]);
             }
         }
         cnt++;

     }
     if(cnt==n)
     {
         cout<<"无环";
         while(!q.empty())
         {
             cout<<q.front()<<" ";
             q.pop();
         }
         //输出拓扑排序序列
     } else
     {
         //存在环
         cout<<"该有向图存在环";
     }




    return 0;
}
